// utils/downloadDocx.ts
import service, { CommonHeaderEnum } from "/@/utils/request"
import { ElMessage } from 'element-plus'

// Blob => 文本（用于后端返回 text/plain 错误时展示）
function blobToText(b: Blob): Promise<string> {
  return new Promise((resolve, reject) => {
    const r = new FileReader()
    r.onload = () => resolve(String(r.result))
    r.onerror = reject
    r.readAsText(b)
  })
}

/**
 * 调用 /html 接口把 HTML 转 DOCX 并触发浏览器下载
 * @param html     富文本 HTML 字符串
 * @param baseUrl  可选，后端用于解析相对资源
 * @param url      接口地址，默认 '/html'，根据你的后端实际调整
 */
export async function downloadDocxFromHtml(
  html: string,
  baseUrl?: string,
  url: string = '/html'
) {
  if (!html?.trim()) {
    ElMessage.error('内容不能为空')
    return
  }

  const res = await service.post(
    url,
    { html, baseUrl },
    {
      // ⚠️ 必须：按二进制接收
      responseType: 'blob',
      // ⚠️ 跳过你们的“自动加密”，否则后端拿不到正常 JSON
      headers: {
        [CommonHeaderEnum.ENC_FLAG]: true,        // Enc-Flag: true ⇒ 不加密
        'Content-Type': 'application/json',
      },
    }
  )

  // 你的响应拦截器会返回 data，这里拿到的是 Blob
  const data = res as unknown as Blob
  const contentType = (data as any).type || ''

  // 如果后端用 text/plain 返回错误信息，这里弹出
  if (contentType.startsWith('text/plain') || contentType.includes('json')) {
    const msg = await blobToText(data)
    ElMessage.error(msg || '导出失败')
    return
  }

  // 从原始响应头里拿不到，这里用 axios 实例的“完整响应”会更稳
  // 但你的拦截器返回的是 data。若需要从 header 拿文件名：
  // 方案1：后端把文件名也放进自定义响应头，并在拦截器里保留（需要改拦截器）
  // 方案2：直接用默认文件名
  const fileName = `converted-${Date.now()}.docx`  // 简单起见

  const urlObj = URL.createObjectURL(data)
  const a = document.createElement('a')
  a.href = urlObj
  a.download = fileName
  document.body.appendChild(a)
  a.click()
  a.remove()
  URL.revokeObjectURL(urlObj)

  ElMessage.success('导出成功')
}
